#pragma once
#ifndef __SINGLETON_H__
#define __SINGLETON_H__

template<typename Type>
class Singleton
{
public:
	Singleton() = delete;
	~Singleton() = delete;
	Singleton(Singleton<Type> const &) = delete;
	Singleton& operator=(Singleton<Type> const &) = delete;
public:
	static Type& getInstance() {
		static Type instance;
		return instance;
	}
};



template<typename Type>
class EagerSingleton
{
public:
	EagerSingleton() = delete;
	~EagerSingleton() = delete;
	EagerSingleton(EagerSingleton<Type> const &) = delete;
	EagerSingleton& operator=(EagerSingleton<Type> const &) = delete;
public:
	static Type& getInstance() {
		return instance;
	}
private:
	friend Type;
	static Type instance;
};

// Eager Singleton
// Lazy Singleton

#endif // __SINGLETON_H__